package main
import (
	"fmt"
	"net"
	"time"

	"github.com/gowvp/gb28181"
)

// SendSIPMessage 实际发送 SIP 消息的函数
func SendSIPMessage(message string, serverAddr string) error {
	conn, err := net.Dial("udp", serverAddr)
	if err != nil {
		return err
	}
	defer conn.Close()

	_, err = conn.Write([]byte(message))
	if err != nil {
		return err
	}

	buffer := make([]byte, 1024)
	_, err = conn.Read(buffer)
	if err != nil {
		return err
	}

	fmt.Printf("收到 SIP 响应: %s\n", string(buffer))
	return nil
}


// PTZControl 实现向 GB28181 客户端发送 PTZ 控制命令
func (c *gb28181.Client) PTZControl(cmd gb28181.PTZCommand) error {
	// 这里是模拟实现，实际中需要根据 GB28181 协议构造 SIP 消息并发送
	// 首先检查客户端是否已经启动
	if!c.IsRunning() {
		return fmt.Errorf("GB28181 客户端未启动")
	}

	// 模拟构造 SIP 消息
	sipMessage := fmt.Sprintf("SIP/2.0 PTZ Control Request\nDeviceID: %s\nHorizontalSpeed: %d\nVerticalSpeed: %d\nZoomSpeed: %d\nAction: %d",
		cmd.DeviceID, cmd.HorizontalSpeed, cmd.VerticalSpeed, cmd.ZoomSpeed, cmd.Action)

	// 模拟发送 SIP 消息
	fmt.Printf("发送 SIP 消息:\n%s\n", sipMessage)

	// 模拟等待响应
	time.Sleep(1 * time.Second)

	// 模拟发送确认消息
	confirmMessage := fmt.Sprintf("SIP/2.0 PTZ Control Confirm\nDeviceID: %s", cmd.DeviceID)
	fmt.Printf("发送确认消息:\n%s\n", confirmMessage)

	// 模拟等待确认响应
	time.Sleep(1 * time.Second)

	// 模拟响应成功
	fmt.Println("收到 PTZ 控制命令响应，操作成功")
	return nil
}


// PTZControl 实现向 GB28181 客户端发送 PTZ 控制命令
func (c *gb28181.Client) PTZControl(cmd gb28181.PTZCommand) error {
	// 这里是模拟实现，实际中需要根据 GB28181 协议构造 SIP 消息并发送
	// 首先检查客户端是否已经启动
	if!c.IsRunning() {
		return fmt.Errorf("GB28181 客户端未启动")
	}

	// 模拟构造 SIP 消息
	sipMessage := fmt.Sprintf("SIP/2.0 PTZ Control Request\nDeviceID: %s\nHorizontalSpeed: %d\nVerticalSpeed: %d\nZoomSpeed: %d\nAction: %d",
		cmd.DeviceID, cmd.HorizontalSpeed, cmd.VerticalSpeed, cmd.ZoomSpeed, cmd.Action)

	// 模拟发送 SIP 消息
	fmt.Printf("发送 SIP 消息:\n%s\n", sipMessage)

	// 模拟等待响应
	time.Sleep(1 * time.Second)

	// 模拟响应成功
	fmt.Println("收到 PTZ 控制命令响应，操作成功")
	return nil
}

// 以下是原代码剩余部分
func main() {
	// 配置 GB28181 客户端参数
	clientConfig := gb28181.ClientConfig{
		ServerID:   "34020000002000000001", // 服务端 ID
		ServerIP:   "192.168.1.100",        // 服务端 IP
		ServerPort: 5060,                   // 服务端端口
		ClientID:   "34020000001320000001", // 客户端 ID
		ClientIP:   "192.168.1.101",        // 客户端 IP
		ClientPort: 5060,                   // 客户端端口
		Password:   "123456",               // 密码
	}

	// 创建 GB28181 客户端
	client, err := gb28181.NewClient(clientConfig)
	if err != nil {
		fmt.Printf("创建 GB28181 客户端失败: %v\n", err)
		return
	}
	defer client.Stop()

	// 启动客户端
	if err := client.Start(); err != nil {
		fmt.Printf("启动 GB28181 客户端失败: %v\n", err)
		return
	}

	// 等待客户端注册成功
	time.Sleep(2 * time.Second)

	// 目标设备 ID
	deviceID := "34020000001320000002"

	// 构造 PTZ 控制命令
	ptzCmd := gb28181.PTZCommand{
		DeviceID:        deviceID,
		HorizontalSpeed: 100, // 水平速度，范围 0 - 255
		VerticalSpeed:   100, // 垂直速度，范围 0 - 255
		ZoomSpeed:       0,   // 变倍速度，范围 0 - 255
		Action:          1,   // 控制动作，0 停止，1 上，2 下，3 左，4 右，5 左上，6 左下，7 右上，8 右下
	}

	// 发送 PTZ 控制命令
	if err := client.PTZControl(ptzCmd); err != nil {
		fmt.Printf("发送 PTZ 控制命令失败: %v\n", err)
		return
	}

	fmt.Println("PTZ 控制命令发送成功")
}

	"github.com/gowvp/gb28181"
)

func main() {
	// 配置 GB28181 客户端参数
	clientConfig := gb28181.ClientConfig{
		ServerID:   "34020000002000000001", // 服务端 ID
		ServerIP:   "192.168.1.100",        // 服务端 IP
		ServerPort: 5060,                   // 服务端端口
		ClientID:   "34020000001320000001", // 客户端 ID
		ClientIP:   "192.168.1.101",        // 客户端 IP
		ClientPort: 5060,                   // 客户端端口
		Password:   "123456",               // 密码
	}

	// 创建 GB28181 客户端
	client, err := gb28181.NewClient(clientConfig)
	if err != nil {
		fmt.Printf("创建 GB28181 客户端失败: %v\n", err)
		return
	}
	defer client.Stop()

	// 启动客户端
	if err := client.Start(); err != nil {
		fmt.Printf("启动 GB28181 客户端失败: %v\n", err)
		return
	}

	// 等待客户端注册成功
	time.Sleep(2 * time.Second)

	// 目标设备 ID
	deviceID := "34020000001320000002"

	// 构造 PTZ 控制命令
	ptzCmd := gb28181.PTZCommand{
		DeviceID:        deviceID,
		HorizontalSpeed: 100, // 水平速度，范围 0 - 255
		VerticalSpeed:   100, // 垂直速度，范围 0 - 255
		ZoomSpeed:       0,   // 变倍速度，范围 0 - 255
		Action:          1,   // 控制动作，0 停止，1 上，2 下，3 左，4 右，5 左上，6 左下，7 右上，8 右下
	}

	// 发送 PTZ 控制命令
	if err := client.PTZControl(ptzCmd); err != nil {
		fmt.Printf("发送 PTZ 控制命令失败: %v\n", err)
		return
	}

	fmt.Println("PTZ 控制命令发送成功")
}
